Skip to content

批量篡改请求资源为本地文件

概述

本文档介绍如何使用 LocalResourceTamperingManagerVipResourceTamperingHelper 两个核心类实现批量篡改网络请求资源为本地文件的功能。通过这种方式,可以将网页中的所有静态资源(JS、CSS、图片、字体等)自动替换为本地文件,实现完全离线或者自定义资源的需求。

功能特性

  • 🔄 批量处理:一次性设置整个文件夹的资源篡改
  • 🎯 智能匹配:基于文件名进行模糊匹配,自动拦截相关网络请求
  • 📋 自动分类:支持多种文件格式的MIME类型自动识别
  • 📊 统计报告:提供详细的设置成功/失败统计信息
  • 🛡️ VIP权限验证:确保只有VIP用户才能使用篡改功能
  • 🔧 灵活管理:支持动态添加、移除和重置篡改规则

核心类说明

1. LocalResourceTamperingManager(本地资源篡改管理器)

负责具体的资源篡改实现,是底层的核心管理类。

主要功能:

  • 扫描本地资源文件夹
  • 设置单个文件的篡改规则
  • MIME类型自动识别
  • 统计信息收集
  • 资源清理和释放

2. VipResourceTamperingHelper(VIP资源篡改助手)

提供简洁的静态方法接口,是对外的主要调用入口。

主要功能:

  • 全局VIP状态管理
  • 浏览器实例管理
  • 简化的调用接口
  • 批量清理操作
  • 权限检查和验证

使用方法

第一步:准备资源文件

首先,创建一个 resource 文件夹,并按照类型组织你的本地资源文件:

resource/
├── js/
│   ├── main.js
│   ├── app.js
│   ├── config.js
│   └── lib/
│       ├── jquery.js
│       └── bootstrap.js
├── css/
│   ├── style.css
│   ├── theme.css
│   └── responsive.css
├── images/
│   ├── logo.png
│   ├── banner.jpg
│   └── icons/
│       ├── home.svg
│       └── user.svg
├── fonts/
│   ├── custom.woff2
│   └── icon-font.woff
└── other/
    ├── config.json
    └── data.xml

第二步:VIP权限设置

在程序启动时设置VIP权限:

csharp
// 在 Program.cs 中
class Program
{
    static void Main()
    {
        // 设置VIP授权(这里需要你的实际授权码)
        bool vipAuthorized = FBroSharpAPI.SetAuthorizationCode("你的VIP授权码");
        
        // 告诉VipResourceTamperingHelper VIP权限状态
        VipResourceTamperingHelper.SetGlobalVipStatus(vipAuthorized);
        
        if (vipAuthorized)
        {
            Console.WriteLine("✅ VIP权限验证成功");
            // 启动应用程序
            Application.Run(new Form1());
        }
        else
        {
            Console.WriteLine("❌ VIP权限验证失败,程序将以普通模式运行");
            // 可以选择继续运行但不启用篡改功能
            Application.Run(new Form1());
        }
    }
}

第三步:在浏览器创建后设置资源篡改

在浏览器创建完成的事件中调用资源篡改设置:

csharp
// 在 BrowserEvent.cs 的 OnAfterCreated 事件中
public void OnAfterCreated(IFBroSharpBrowser browser)
{
    try
    {
        Console.WriteLine("浏览器创建完成,开始设置资源篡改...");
        
        // 使用默认路径(程序目录/resource)
        bool success = VipResourceTamperingHelper.SetupResourceTampering(browser);
        
        if (success)
        {
            Console.WriteLine("🎉 资源篡改设置成功!");
            
            // 获取篡改统计信息
            int ruleCount = VipResourceTamperingHelper.GetTamperingRulesCount(browser);
            Console.WriteLine($"📊 当前活跃篡改规则数量: {ruleCount}");
            
            // 显示活跃的篡改规则
            var activeRules = VipResourceTamperingHelper.GetActiveTamperingRules(browser);
            Console.WriteLine("🔗 活跃篡改规则:");
            foreach (var rule in activeRules)
            {
                Console.WriteLine($"  - {rule.Key} -> {rule.Value}");
            }
        }
        else
        {
            Console.WriteLine("❌ 资源篡改设置失败");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"❌ 设置资源篡改时发生错误: {ex.Message}");
    }
}

第四步:指定自定义资源路径(可选)

如果资源不在默认的 resource 文件夹中,可以指定自定义路径:

csharp
// 指定自定义资源路径
string customResourcePath = @"C:\MyCustomResources";
bool success = VipResourceTamperingHelper.SetupResourceTampering(browser, customResourcePath);

第五步:清理资源篡改

在程序退出或浏览器关闭时清理资源:

csharp
// 在程序退出时清理所有资源篡改
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    try
    {
        Console.WriteLine("程序正在退出,清理资源篡改...");
        
        // 清理所有浏览器的资源篡改
        int cleanupCount = VipResourceTamperingHelper.CleanupAllResourceTampering();
        Console.WriteLine($"✅ 已清理 {cleanupCount} 个浏览器的资源篡改设置");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"⚠️ 清理资源时发生错误: {ex.Message}");
    }
}

// 或者清理单个浏览器的资源篡改
private void CleanupSingleBrowser(IFBroSharpBrowser browser)
{
    VipResourceTamperingHelper.CleanupResourceTampering(browser);
}

完整使用示例

以下是一个完整的使用示例:

csharp
using System;
using System.IO;
using System.Windows.Forms;
using FBroSharp;
using FBroSharp.Lib;

namespace _045VIP篡改请求为本地文件
{
    public partial class Form1 : Form
    {
        private IFBroSharpBrowser _browser;
        
        public Form1()
        {
            InitializeComponent();
            CreateBrowser();
        }
        
        private void CreateBrowser()
        {
            try
            {
                // 创建浏览器实例
                _browser = FBroSharpAPI.CreateBrowser(this, new FBroSharpBrowserInitSettings
                {
                    Width = this.Width,
                    Height = this.Height,
                    StartURL = "https://example.com"
                });
                
                // 设置浏览器事件
                _browser.BrowserEvent.OnAfterCreated += OnBrowserCreated;
                _browser.BrowserEvent.OnBeforeClose += OnBrowserClosing;
            }
            catch (Exception ex)
            {
                MessageBox.Show($"创建浏览器失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        private void OnBrowserCreated(IFBroSharpBrowser browser)
        {
            try
            {
                Console.WriteLine("🔧 浏览器创建完成,开始设置资源篡改...");
                
                // 检查资源文件夹是否存在
                string resourcePath = Path.Combine(Application.StartupPath, "resource");
                if (!Directory.Exists(resourcePath))
                {
                    Console.WriteLine($"❌ 资源文件夹不存在: {resourcePath}");
                    Console.WriteLine("请创建resource文件夹并放入要篡改的资源文件");
                    return;
                }
                
                // 设置资源篡改
                bool success = VipResourceTamperingHelper.SetupResourceTampering(browser, resourcePath);
                
                if (success)
                {
                    Console.WriteLine("🎉 资源篡改设置成功!");
                    
                    // 显示详细统计信息
                    ShowTamperingStatus(browser);
                }
                else
                {
                    Console.WriteLine("❌ 资源篡改设置失败,请检查VIP权限和资源文件");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"❌ 设置资源篡改时发生错误: {ex.Message}");
            }
        }
        
        private void ShowTamperingStatus(IFBroSharpBrowser browser)
        {
            try
            {
                // 获取篡改规则数量
                int ruleCount = VipResourceTamperingHelper.GetTamperingRulesCount(browser);
                Console.WriteLine($"📊 活跃篡改规则数量: {ruleCount}");
                
                // 显示活跃的篡改规则
                var activeRules = VipResourceTamperingHelper.GetActiveTamperingRules(browser);
                if (activeRules.Count > 0)
                {
                    Console.WriteLine("🔗 活跃篡改规则列表:");
                    foreach (var rule in activeRules)
                    {
                        Console.WriteLine($"  📄 {rule.Key} -> {rule.Value}");
                    }
                }
                
                // 检查VIP权限状态
                bool hasVipPermission = VipResourceTamperingHelper.CheckVipPermission(browser);
                Console.WriteLine($"🛡️ VIP权限状态: {(hasVipPermission ? "✅ 有效" : "❌ 无效")}");
                
                // 检查是否已启用资源篡改
                bool isEnabled = VipResourceTamperingHelper.IsResourceTamperingEnabled(browser);
                Console.WriteLine($"🔄 资源篡改状态: {(isEnabled ? "✅ 已启用" : "❌ 未启用")}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"⚠️ 显示篡改状态时发生错误: {ex.Message}");
            }
        }
        
        private void OnBrowserClosing(IFBroSharpBrowser browser)
        {
            try
            {
                Console.WriteLine("🔧 浏览器正在关闭,清理资源篡改...");
                
                // 清理该浏览器的资源篡改
                bool success = VipResourceTamperingHelper.CleanupResourceTampering(browser);
                if (success)
                {
                    Console.WriteLine("✅ 浏览器资源篡改清理成功");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"⚠️ 清理浏览器资源时发生错误: {ex.Message}");
            }
        }
        
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                Console.WriteLine("🔧 程序正在退出,清理所有资源篡改...");
                
                // 清理所有浏览器的资源篡改
                int cleanupCount = VipResourceTamperingHelper.CleanupAllResourceTampering();
                Console.WriteLine($"✅ 已清理 {cleanupCount} 个浏览器的资源篡改设置");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"⚠️ 程序退出清理时发生错误: {ex.Message}");
            }
        }
        
        // 可选:提供手动重置功能
        private void btnResetTampering_Click(object sender, EventArgs e)
        {
            try
            {
                if (_browser != null)
                {
                    Console.WriteLine("🔄 手动重置资源篡改...");
                    
                    // 重置资源篡改
                    bool success = VipResourceTamperingHelper.ResetResourceTampering(_browser);
                    if (success)
                    {
                        Console.WriteLine("✅ 资源篡改重置成功");
                        ShowTamperingStatus(_browser);
                    }
                    else
                    {
                        Console.WriteLine("❌ 资源篡改重置失败");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"❌ 重置资源篡改时发生错误: {ex.Message}");
            }
        }
    }
}

支持的文件类型和MIME映射

系统自动支持以下文件类型的MIME类型识别:

JavaScript文件

  • .jsapplication/javascript
  • .mjsapplication/javascript

CSS文件

  • .csstext/css

图片文件

  • .pngimage/png
  • .jpg, .jpegimage/jpeg
  • .gifimage/gif
  • .svgimage/svg+xml
  • .webpimage/webp
  • .icoimage/x-icon

字体文件

  • .wofffont/woff
  • .woff2font/woff2
  • .ttffont/ttf
  • .otffont/otf
  • .eotapplication/vnd.ms-fontobject

数据文件

  • .jsonapplication/json
  • .xmlapplication/xml
  • .txttext/plain

网页文件

  • .html, .htmtext/html

其他文件

  • .pdfapplication/pdf
  • .zipapplication/zip
  • .mp4video/mp4
  • .mp3audio/mpeg

匹配机制说明

文件名模糊匹配

系统使用 FBroSharpResponseURLFindType.FuzzyMatch 进行文件名模糊匹配:

csharp
// 例如本地文件:resource/js/main.js
// 会匹配所有包含 "main.js" 的URL:
// ✅ https://cdn.example.com/assets/main.js
// ✅ https://example.com/static/js/main.js
// ✅ http://localhost:8080/dist/main.js
// ❌ https://example.com/other.js (不匹配)

匹配优先级

当多个本地文件可能匹配同一个网络请求时,系统按照以下规则处理:

  1. 精确匹配优先:完全相同的文件名优先匹配
  2. 后设置覆盖:后设置的规则会覆盖先前的规则
  3. 文件扩展名匹配:相同扩展名的文件优先匹配

调试和诊断

1. 检查VIP权限

csharp
// 检查全局VIP状态
bool hasGlobalVip = VipResourceTamperingHelper.CheckVipPermission(browser);

// 检查浏览器VIP控制器
var vipControl = browser.GetVIPControl();
bool hasBrowserVip = vipControl?.IsValid == true;

Console.WriteLine($"全局VIP状态: {hasGlobalVip}");
Console.WriteLine($"浏览器VIP状态: {hasBrowserVip}");

2. 查看篡改状态

csharp
// 显示所有浏览器的篡改状态
VipResourceTamperingHelper.PrintTamperingStatus();

// 检查特定浏览器是否启用了篡改
bool isEnabled = VipResourceTamperingHelper.IsResourceTamperingEnabled(browser);
Console.WriteLine($"浏览器篡改状态: {isEnabled}");

3. 监控日志输出

系统会在控制台输出详细的操作日志,包括:

  • VIP权限检查结果
  • 文件扫描进度
  • 篡改规则设置结果
  • 错误和异常信息

常见问题

Q1: 为什么资源篡改不生效?

可能原因:

  1. VIP权限验证失败
  2. 资源文件夹路径不正确
  3. 本地文件名与网络请求URL不匹配
  4. 浏览器缓存影响

解决方法:

csharp
// 1. 检查VIP权限
bool hasVip = VipResourceTamperingHelper.CheckVipPermission(browser);
if (!hasVip)
{
    Console.WriteLine("请检查VIP授权码是否正确");
}

// 2. 检查资源路径
string resourcePath = Path.Combine(Application.StartupPath, "resource");
if (!Directory.Exists(resourcePath))
{
    Console.WriteLine($"资源文件夹不存在: {resourcePath}");
}

// 3. 清除浏览器缓存
browser.GetMainFrame().GetBrowser().GetHost().GetClient().GetLoadHandler().OnLoadEnd += (_, __) =>
{
    browser.GetMainFrame().ExecuteJavaScript("location.reload(true);", "", 0);
};

Q2: 如何处理动态生成的文件名?

对于带有版本号或hash的文件(如 main.abc123.js),建议:

  1. 重命名本地文件:将本地文件重命名为简化的名称(如 main.js
  2. 使用通用匹配:创建多个版本的文件来匹配不同的可能性

Q3: 如何验证篡改是否成功?

csharp
// 方法1: 检查网络请求
// 在浏览器中打开开发者工具,查看Network标签页,看请求是否被拦截

// 方法2: 在本地文件中添加标识
// 在CSS或JS文件中添加特殊注释,看是否在网页中生效
/* 🎯 本地资源篡改测试 - 如果你看到这个注释,说明篡改成功了! */

// 方法3: 检查活跃规则
var activeRules = VipResourceTamperingHelper.GetActiveTamperingRules(browser);
Console.WriteLine($"活跃规则数量: {activeRules.Count}");

Q4: 如何处理CORS跨域问题?

系统自动为资源添加跨域响应头:

csharp
// 系统自动添加的响应头
headers.Add(new FBroSharpStringMap { key = "Access-Control-Allow-Origin", value = "*" });

// 对于字体文件,还会添加额外的跨域头
if (mimeType.StartsWith("font/"))
{
    headers.Add(new FBroSharpStringMap { 
        key = "Access-Control-Allow-Headers", 
        value = "Origin, X-Requested-With, Content-Type, Accept" 
    });
}

性能优化建议

1. 文件大小控制

  • 避免过大的资源文件(建议单个文件不超过10MB)
  • 对于大文件,考虑压缩或分割

2. 规则数量控制

  • 避免设置过多的篡改规则(建议不超过1000个)
  • 定期清理不需要的规则

3. 缓存优化

csharp
// 系统自动为资源添加缓存头
headers.Add(new FBroSharpStringMap { key = "Cache-Control", value = "public, max-age=31536000" });

安全注意事项

  1. VIP权限保护:确保VIP授权码的安全,避免泄露
  2. 文件路径验证:避免使用用户输入的路径,防止路径遍历攻击
  3. 文件内容检查:对于重要的资源文件,建议进行内容校验
  4. 权限最小化:只为需要的文件设置篡改规则

总结

通过 LocalResourceTamperingManagerVipResourceTamperingHelper 两个类的配合使用,可以轻松实现批量的网络资源篡改功能。这种方式特别适用于:

  • 离线应用开发:将网页应用转换为完全离线版本
  • 资源本地化:替换CDN资源为本地资源,提高加载速度
  • 开发调试:使用本地修改的资源进行调试
  • 定制化改造:对现有web应用进行界面或功能定制

使用时请注意VIP权限验证和资源文件的正确配置,确保篡改功能能够正常工作。

如果文档对您有帮助,欢迎 请喝咖啡 ☕ | 软件发布 | 源码购买